class MyClass:
    # 1. 公共的类属性：在类内部直接定义即可，所有类的实例都可以访问。示例代码如下：

    public_property = "This is search_text public property"

    # 2. 私有的类属性：在属性名前加上双下划线"__"进行定义，这样就变成了私有属性，只能在类的内部访问。示例代码如下：

    __private_property = "This is search_text private property"
    __private_property = __private_property + __private_property

    # 3. 受保护的类属性：在属性名前加上单下划线"_"进行定义，表示这是一个受保护的属性，子类可以访问但应该视为私有属性，外部不建议直接访问。示例代码如下：

    _protected_property = "This is search_text protected property"

    # 5. Static的类属性：使用`@staticmethod`装饰器来定义静态方法，静态方法可以直接通过类名调用，也可以通过类的实例调用。示例代码如下：

    @staticmethod
    def static_method():
        return "This is search_text static method"

    # 非静态的
    def no_static_method(self):
        return "This is search_text static method"


# 4. 包权限的类属性：在Python中没有包权限的概念，但是可以通过惯例来约定，在模块级别定义的属性或方法以单下划线"_"开头，表示这是一个内部属性或方法，外部不建议直接访问。示例代码如下：

# my_module.py
_internal_property = "This is an internal property"

# 6. Abstract的类属性：使用`@abstractmethod`装饰器来定义抽象方法，抽象方法只有方法定义而没有具体实现，必须在子类中实现。示例代码如下：

from abc import ABC, abstractmethod


class MyAbstractClass(ABC):
    @abstractmethod
    def abstract_method(self):
        pass


if __name__ == '__main__':
    # 这里就是进行了类的实例化，search_text 就是具体这个班级了
    a = MyClass()
    # 实例化后就可以直接调用公共属性了
    print(a.public_property)

    # 静态方法可以实例化后就可以直接调用，也可以非实例化直接调用
    # 这里是实例化后
    print(a.static_method())
    # 这里是非实例化后
    print(MyClass.static_method())
    # 看非静态函数的区别
    print(a.no_static_method())
    # print(MyClass.no_static_method()) 这里要报错了，因为非静态，不实例化是无法使用的，区别就在这里

    # 私有属性实例化后就调取不到了
    # search_text.__private_property 这里打出来会报错，应为调取不到 __private_property 属性就只能在类里面进行使用
    # 看到代码第 9 行，就用了 __private_property ，只能在类里面用了，针对不想暴露的变量进行设置的

    # 受保护的类同样实例化后用不了 _protected_property
    # search_text._protected_property 会报错,只能在类里面使用，不暴露给外面，但是区别在于，继承的类可以使用受保护的属性